package cn.org.xuanguang.kepler.hormos.spring.starter;

import cn.org.xuanguang.kepler.metadata.enums.DataSourceType;
import cn.org.xuanguang.kepler.util.JsonUtils;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * 参数配置
 */
@ConfigurationProperties(prefix = "hormos.ds")
@Data
public class HormosOptions {
    /**
     * 数据源类型
     */
    @NotNull
    private DataSourceType dialect;
    /**
     * 数据源id，用来获取数据源及动态数据源管理使用
     */
    @NotNull
    private String dsId = "default";
    /**
     * 默认的schema,这个是实际的数据库执行的db，必须要添加
     * mysql：schema和catalog相同
     * postgresql：schema和catalog不同
     * oracle：schema和catalog不同
     * sqlserver：schema不同
     */
    @NotNull
    private String schema;

    @NotNull
    private MultiTenantOptions multiTenant;


    /**
     * 获取当前对象所有字段的值作为参数集合。
     * 这个方法会遍历对象的所有字段，将非null字段的名称和值存入一个Map中。
     * 注意，这个方法会将所有字段设置为可访问，即使它们是私有的。
     *
     * @return Map<String, String> 包含对象所有非null字段名称和值的映射。
     * @throws IllegalStateException 如果在构建参数过程中发生异常。
     */
    public Map<String, String> getParams() {
        try {
            // 初始化参数映射
            Map<String, String> params = new HashMap<String, String>();
            // 获取当前对象的所有字段
            Field[] fields = this.getClass().getDeclaredFields();
            // 遍历每个字段
            for (Field field : fields) {
                field.setAccessible(true); // 设置字段为可访问
                Object value = field.get(this); // 获取字段的值
                if (value != null) { // 如果值非null，将其加入到参数映射中
                    params.put(field.getName(), String.valueOf(field.get(this)));
                }
            }
            return params;
        } catch (Exception e) {
            // 如果发生异常，抛出非法状态异常
            throw new IllegalStateException("build params failed: " + e.getMessage());
        }
    }


    public String toString() {
        return JsonUtils.toJSONString(this);
    }
}
